PROGRAMACIÓN
GENÉRICA

“Pensar es olvidar diferencias, es generalizar, abstraer” (Borges)

“Pensamos en generalidades, pero vivimos en detalles” (A.N. Whitehead)

“Siempre se debe generalizar” (Carl Jacobi)

“Lo genérico puede ser más intenso que lo concreto” (Borges)



Programación Genérica

La programación genérica es una técnica de desarrollo de componentes de software tan generales como sea posible, con varios objetivos:
  1. Para que los componentes se puedan reutilizar en otras aplicaciones.

  2. Para que dependan lo menos posible del entorno de ejecución, se ignoren los detalles implementadores y se consiga la interoperabilidad.

  3. Para que los desarrollos sean más conceptuales e inteligibles.
Por ejemplo, un algoritmo podría apoyarse en conceptos generales, tales como: recorrer una estructura de datos, acceder a uno de sus elementos, seleccionar los elementos que cumplen determinadas condiciones, etc.

Aunque estos objetivos son deseables y beneficiosos, existen algunos inconvenientes:
  1. Los desarrollos pueden ser menos eficientes. Generalidad y eficiencia son, en general, fuerzas opuestas.

  2. Si el lenguaje de programación no es de alto nivel, los desarrollos genéricos pueden ser más extensos que los específicos. Esto es debido al código adicional necesario para analizar el tipo de cada argumento, el diferente tratamiento asociado a cada tipo, la posible inclusión de parámetros adicionales, etc.
La implementación de la programación genérica depende fundamentalmente del lenguaje utilizado y del nivel de abstracción que soporta.


Los aspectos genéricos

El concepto “genérico” en programación genérica tiene diferentes aspectos:
Implementación en MENTAL

La programación genérica alcanza su máxima plenitud en este lenguaje, pues cubre todos los aspectos mencionados:
Ejemplos
  1. Copiar los n primeros elementos de la secuencia x en la secuencia y. Supone n>0.

    ⟨( Copiar(x y n) = [y\i = x\i)/(i=[1…n])] )⟩

    Esta función es válida para cualquier secuencia, independientemente del tipo de sus componentes.

    Ejemplo de aplicación:


  2. Sustituir los n primeros elementos de la secuencia x por el elemento y. Supone n>0

    ⟨( Sustituir(x n y) = [x\i = y)/(i=[1…n])] )⟩

    Ejemplos de aplicación:


  3. Sumar todos los componentes de una secuencia.
    En este caso, hay un único parámetro (la secuencia), cuyo número de elementos es variable. Equivale, en definitiva, a un número variable de parámetros.


    Ejemplos de aplicación:



Adenda

Historia de la programación genérica

El lenguaje Lisp se puede considerar implícitamente como el primer lenguaje de programación genérica, gracias a su alto nivel de abstracción, su sistema unificado de almacenamiento de código y datos (las listas), sus tipos dinámicos, su capacidad de parametrización y la posibilidad de trabajar con funciones de orden superior.

El lenguaje C++ es el primer lenguaje en soportar explícitamente dos mecanismos genéricos: C++ es un lenguaje que no tiene versiones. El estándar ANSI/ISO (1988) define el núcleo del lenguaje. C++ es multiparadigma (orientado a objetos, funcional y procedimental).

La eficiencia de un algoritmo puede ser relativa si es tan eficiente como la versión no genérica (escrita en el mismo lenguaje) y absoluta si es tan eficiente como una versión no genérica escrita en lenguaje ensamblador. Con C++ se ha conseguido una eficiencia relativa y aproximarse a la absoluta, de tal forma que eficiencia y generalidad no sean mutuamente exclusivas.

Se considera que la verdadera programación genérica nació con el trabajo de Alexander Stepanov con el lenguaje Ada y que posteriormente traslado a C++ para crear la STL (Standard Template Library, Biblioteca de Plantillas Estándar), biblioteca de componentes genéricos de software implementados como plantillas, que fue adoptada como estándar ANSI/ISO del lenguaje. A esta biblioteca siguieron otras, también de tipo genérico, como la Boost Graph Library y la Matrix Template Library. C++ se convirtió entonces en un lenguaje multiparadigma enriquecido con la programación genérica.

La programación genérica es un paradigma que ha ido cobrando una creciente importancia, de tal forma que, en los últimos años, muchos lenguajes (como Stándard ML, Haskell, Eiffel y Java) han incorporado mecanismos genéricos (al menos de forma básica), inspirados principalmente por el modelo STL. Lenguajes específicos recientes de programación genérica son Generic Haskell (2000) y Generic C# (2003).


STL

La biblioteca de plantillas de C++ fue diseñada para lograr la máxima reusabilidad sin sacrificar la eficiencia. Su importancia radica en sus conceptos (o categorías abstractas), más que en los detalles implementadores. Las fuentes STL tienen la sintaxis C. Es posible incluso programar en STL sin saber C++. Entre estos conceptos los más destacados son los siguientes:
Bibliografía